#include <stdio.h>
#include <mariadb/mysql.h> //mariadb的头文件

#define HOST "127.0.0.1"          // 目标mariadb_server所在主机的IP
#define USER "root"               // 目标是 mysql（当前是mariadb）的哪个用户
#define PASSWORD "securepassword" // 目标用户登录密码
#define DATABASE "test_db"        // 目标数据库
#define PORT 0                    // 目标mariadb_server的端口号，在所有主机上默认都是3306，这里0代表默认端口3306

void Add(MYSQL *mysql)
{
    // 5.sql语句发给server执行
    const char *sql_statement = "insert into test_tb values (1, 100, '张三', 90.9999),(2, 10, '李四', 20.123);";
    int re_query = mysql_query(mysql, sql_statement);
    if (re_query != 0)
    {
        perror("Add fail");
        printf("Add fail:%s", mysql_error(mysql));
        return;
    }
}
void Del(MYSQL *mysql)
{
    // 5.sql语句发给server执行
    const char *sql_statement = "delete from test_tb where id>0;";
    int re_query = mysql_query(mysql, sql_statement);
    if (re_query != 0)
    {
        perror("Del fail");
        printf("Del fail:%s", mysql_error(mysql));
        return;
    }
}
void Get(MYSQL *mysql)
{
    // 5.sql语句发给server执行
    const char *sql_statement = "select * from test_tb;";
    int re_query = mysql_query(mysql, sql_statement);
    if (re_query != 0)
    {
        perror("Get fail");
        printf("Get fail:%s", mysql_error(mysql));

        return;
    }
    MYSQL_RES *res = mysql_store_result(mysql); // 结果集
    if (res == NULL)
    {
        printf("mysql_store_result fail:%s", mysql_error(mysql));
        return;
    }
    // 获取结果集的行列
    int row = mysql_num_rows(res);
    int col = mysql_num_fields(res);
    printf("%-10s%-10s%-10s%-10s\n", "id", "age", "name", "score");
    for (int i = 0; i < row; i++)
    {
        MYSQL_ROW rowdata = mysql_fetch_row(res); // 自带记录功能，依次获取行首地址
        for (int j = 0; j < col; j++)
        {
            printf("%-10s", rowdata[j]);
        }
        printf("\n");
    }
    // 释放结果集
    mysql_free_result(res);
}
void Mod(MYSQL *mysql)
{
    // 5.sql语句发给server执行
    const char *sql_statement = "update test_tb set score=60.345 where id=2;";
    int re_query = mysql_query(mysql, sql_statement);
    if (re_query != 0)
    {
        perror("Mod fail");
        printf("Mod fail:%s", mysql_error(mysql));

        return;
    }
}

int main()
{
    // 1.堆上动态开辟操作句柄空间(定义) + 初始化
    MYSQL *mysql = mysql_init(NULL);
    if (mysql == NULL)
    {
        perror("mysql_init fail");
        return -1;
    }
    // 2.连接mariadb_server
    MYSQL *re_mysql = mysql_real_connect(mysql, HOST, USER, PASSWORD, DATABASE, PORT, NULL, 0); // 成功返回非空
    if (re_mysql == NULL)
    {
        perror("mysql_real_connect fail");
        return -1;
    }
    // 3.设置当前客户端的字符集，要和server保持统一
    int re_character = mysql_set_character_set(mysql, "utf8"); // 成功返回0
    if (re_character != 0)
    {
        perror("mysql_set_character_set fail");
        return -1;
    }
    // // 4.选择操作的数据库---不选好像也行，前面连接时选过了
    // int re_data = mysql_select_db(mysql, DATABASE);
    // if (re_data != 0)
    // {
    //     perror("mysql_select_db fail");
    //     return -1;
    // }

    Add(mysql);
    Get(mysql);
    Mod(mysql);
    Get(mysql);
    Del(mysql);

    return 0;
}